package com.wyp168.socket.QQ.qqserver.services;

import java.net.Socket;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

/**
 * @ClassName ManagerServerSocketThread
 * @Title 管理服务器与客户端连接的socket对象对应的线程
 * @Author wyp168
 * @Date 2022/10/30 16:26
 */
public class ManagerClientSocketThread {

    private static Map<String, ServerConnectClientThread> tm = new ConcurrentHashMap<>();

    /**
     * 添加客户端对应的线程对象 到 tm集合中
     * @param clientId 客户端Id/ 用户Id
     * @param serverConnectClientThread 客户端对应的线程对象
     */
    public static void addClientSocket(String clientId, ServerConnectClientThread serverConnectClientThread) {
        tm.put(clientId, serverConnectClientThread);
    }

    /**
     * 从tm集合中，获取客户端对应的线程对象
     * @param clientId 客户端Id/ 用户Id
     * @return 客户端对应的线程对象
     */
    public static ServerConnectClientThread getServerConnectClientThread(String clientId) {
        return tm.get(clientId);
    }

    /**
     * 从tm集合中，获取除了传递过来的用户id以外的所有其他用户id(完善群发功能)
     */
    public static List<String> getAllExcludeBySenderId(String sendId) {
        return tm.keySet().stream().filter(s -> !s.equals(sendId)).collect(Collectors.toList());
    }

    /**
     * 从tm集合中，移除客户端对应的线程对象
     * @param userId 用户ID
     * @return 如果有对象则移除，并返回true；若没有指定的用户，则返回false
     */
    public static boolean removeThread(String userId) {
        ServerConnectClientThread remove = null;
        if (!Objects.isNull(userId)) {
            remove = tm.remove(userId);
        }
        return !Objects.isNull(remove);
    }

    /**
     * 返回所有以userid组成的字符串
     * @return 结果以："zhangsan lisi wangwu" 这种 以空格隔开的字符串
     */
    public static String getOnlineUsers() {
        Iterator<String> iterator = tm.keySet().iterator();
        String onlineUsers = "";

        while (iterator.hasNext()) {
            onlineUsers += iterator.next().toString() + " ";
        }
        return onlineUsers;
    }
}
